package com.hp.ams.ongoing.netatendimento.view.managedbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionListener;

import org.primefaces.event.FileUploadEvent;

import com.hp.ams.ongoing.netatendimento.application.constants.ApplicationConstantsEnum;
import com.hp.ams.ongoing.netatendimento.application.contract.IServiceProcessAnalysis;
import com.hp.ams.ongoing.netatendimento.application.impl.ContextServiceProcess;
import com.hp.ams.ongoing.netatendimento.application.impl.ServiceBasicData;
import com.hp.ams.ongoing.netatendimento.infrastructure.exception.DataBaseAcessException;
import com.hp.ams.ongoing.netatendimento.infrastructure.util.StringUtil;
import com.hp.ams.ongoing.netatendimento.model.entity.Cidade;
import com.hp.ams.ongoing.netatendimento.model.entity.TipoRegistro;
import com.hp.ams.ongoing.netatendimento.model.valueobject.IncidentVO;
import com.hp.ams.ongoing.netatendimento.model.valueobject.ResultAnalysisVO;
import com.hp.ams.ongoing.netatendimento.test.MockNetAnalyser;

@ManagedBean(name="incidentMB")
@SessionScoped
public class IncidentMB implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -49818908560059857L;
 
	private String numChamado;
	
	private String vlrRegistro;
	
	private TipoRegistro tipoRegistro;
	
	private Cidade cidadeSelecionada;
	
    private Map<String,String> lstTipoRegistro = new HashMap<String, String>();  
    
    private List<Cidade> lstOperadoras;
    
    private List<TipoRegistro> lstTiposRegistro;

    private List<IncidentVO> lstIncidents = new ArrayList<IncidentVO>();
    
    private List<ResultAnalysisVO> lstResultAnalysis = new ArrayList<ResultAnalysisVO>();
    
    public IncidentMB() {    	
    	
	}


	public String getNumChamado() {
		return numChamado;
	}


	public void setNumChamado(String numChamado) {
		this.numChamado = numChamado;
	}


	public String getVlrRegistro() {
		return vlrRegistro;
	}


	public void setVlrRegistro(String vlrRegistro) {
		this.vlrRegistro = vlrRegistro;
	}


	public TipoRegistro getTipoRegistro() {
		return tipoRegistro;
	}


	public void setTipoRegistro(TipoRegistro tipoRegistro) {
		this.tipoRegistro = tipoRegistro;
	}


	public Map<String, String> getLstTipoRegistro() {
		return lstTipoRegistro;
	}


	public void setLstTipoRegistro(Map<String, String> lstTipoRegistro) {
		this.lstTipoRegistro = lstTipoRegistro;
	}


	public List<Cidade> getLstOperadoras() {
		if (lstOperadoras == null)
			try {
				lstOperadoras = ServiceBasicData.getInstance().getAllCidades();
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return lstOperadoras;
	}


	public void setLstOperadoras(List<Cidade> lstOperadoras) {
		this.lstOperadoras = lstOperadoras;
	}


	public List<IncidentVO> getLstIncidents() {
		return lstIncidents;
	}


	public void setLstIncidents(List<IncidentVO> lstIncidents) {
		this.lstIncidents = lstIncidents;
	}


	public List<TipoRegistro> getLstTiposRegistro() {
		if (lstTiposRegistro == null)
			try {
				lstTiposRegistro = ServiceBasicData.getInstance().getAllTipoRegistro();
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return lstTiposRegistro;
	}


	public void setLstTiposRegistro(List<TipoRegistro> lstTiposRegistro) {
		this.lstTiposRegistro = lstTiposRegistro;
	}


	public List<ResultAnalysisVO> getLstResultAnalysis() {
		return lstResultAnalysis;
	}


	public void setLstResultAnalysis(List<ResultAnalysisVO> lstResultAnalysis) {
		this.lstResultAnalysis = lstResultAnalysis;
	}


	public Cidade getCidadeSelecionada() {
		return cidadeSelecionada;
	}


	public void setCidadeSelecionada(Cidade cidadeSelecionada) {
		this.cidadeSelecionada = cidadeSelecionada;
	}

	private void cleanFields(){
		setNumChamado(null);
		setTipoRegistro(null);
		setVlrRegistro(null);
		setCidadeSelecionada(null);
	}

	public void populateIncidentsList(ActionListener listener){		
		IncidentVO vo = new IncidentVO();
		vo.setNumChamado(this.numChamado);
		vo.setTipoRegistro(this.tipoRegistro);
		vo.setVlrRegistro(this.vlrRegistro);
		vo.setCidade(this.cidadeSelecionada);
		getLstIncidents().add(vo);
		cleanFields();
	}
	
	public void analyseIncidents(ActionListener listener){
		IServiceProcessAnalysis service  = ContextServiceProcess.getMapService().get(ApplicationConstantsEnum.GRUPO_NETSALES);		
		List<ResultAnalysisVO> res1 = null;
		for (IncidentVO vo : MockNetAnalyser.mockIncidents1()) {
			try {
				res1 = service.process(vo);
			} catch (DataBaseAcessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		List<ResultAnalysisVO> resAll = new ArrayList<ResultAnalysisVO>();
		
		resAll.addAll(res1);
		
		setLstResultAnalysis(res1);
	}
	
	 public List<Cidade> completeCidades(String query) {  
	        List<Cidade> suggestions =  new ArrayList<Cidade>();  
	        for(Cidade p : getLstOperadoras()) {  
	            if(StringUtil.matchExpr(p.toString().trim(), query.toUpperCase()))  {
	                suggestions.add(p);  
	            }
	        }  	          
	        return suggestions;  
	    }  
	 
	 public List<TipoRegistro> completeTiposRegistro(String query) {  
	        List<TipoRegistro> suggestions =  new ArrayList<TipoRegistro>();  
	        for(TipoRegistro p : getLstTiposRegistro()) {  
	            if(StringUtil.matchExpr(p.toString().trim(), query.toUpperCase()))  {
	                suggestions.add(p);  
	            }
	        }  	          
	        return suggestions;  
	    }  
	 
	 public void handleFileUpload(FileUploadEvent event) {
		   FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");  
	        FacesContext.getCurrentInstance().addMessage(null, msg); 
	      System.out.println(event.getFile().getFileName());  
	    } 

    
}
